import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

public class Lesson17 {

    /**
     *  当几个阶段中的一个完成，创建一个完成的阶段
     *
     * 下面的例子演示了当任意一个CompletableFuture完成后， 创建一个完成的CompletableFuture.
     *
     * 待处理的阶段首先创建， 每个阶段都是转换一个字符串为大写。
     * 因为本例中这些阶段都是同步地执行(thenApply), 从anyOf中创建的CompletableFuture会立即完成，
     * 这样所有的阶段都已完成，我们使用whenComplete(BiConsumer<? super Object, ? super Throwable> action)处理完成的结果。
     **/
    public static void main(String[] args) {

        List<String> messages = Arrays.asList("a", "b", "c");
        StringBuilder stringBuilder = new StringBuilder();
        List<CompletableFuture>  futures = messages.stream().map(msg -> CompletableFuture.completedFuture(msg).thenApply(String::toUpperCase))
                .collect(Collectors.toList());
        CompletableFuture result = CompletableFuture.anyOf(futures.toArray(new CompletableFuture[futures.size()]))
                .whenComplete((res, th) ->{
                    System.out.println(res);
                    stringBuilder.append(res);
                });
        System.out.println(stringBuilder.toString());
        System.out.println(result.getNow(null));
    }
}
